package com.spzx.product.utils;

import com.spzx.product.api.vo.CategoryVo;

import java.util.ArrayList;
import java.util.List;

public class CategoryUtils {
    public static List<CategoryVo> buildTree(List<CategoryVo> categoryVoList) {
        //1 创建存储树结构的列表
        ArrayList<CategoryVo> trees = new ArrayList<>();
        //2 根据查询出来的全部分类获得第一层数据
        categoryVoList.forEach(categoryVo -> {
            //2.1 如果父id为0，说明为第一层数据，将其加入队列
            if (categoryVo.getParentId().longValue() == 0){
                //2.2 从宏观上看每次循环讲一个第一层数据加入列表，但是在内部，每次加入一个元素都会将其children元素填充
                trees.add(findChildren(categoryVo,categoryVoList));
            }

    });

        return trees;
 }
//用于为children属性赋值的函数，为递归函数
    public static CategoryVo findChildren(CategoryVo categoryVo, List<CategoryVo> categoryVoList) {
        //1 别管有没有数据，先给children属性设置一个空集合
        categoryVo.setChildren(new ArrayList<>());
        //2 遍历所有分类的列表，选取当前categoryVo对象的下一层
        categoryVoList.forEach(categoryVoChildren ->{
            //2.1 被遍历结点是否为当前结点的子节点
            if (categoryVoChildren.getParentId().longValue() == categoryVo.getId().longValue()){
                //2.2 将当前结点的子节点放入当前结点，并且调用递归函数，为当前结点的子节点填充
                categoryVo.getChildren().add(findChildren(categoryVoChildren,categoryVoList));
            }
        });
    //3 返回当前结点
        return  categoryVo;
    }

    }



